import type { UploadHooks } from '../types/index.ts'
import { Message } from '../hooks/Message.ts'

// 生命周期钩子
class LifeCycle {
  private Hooks: Record<string, any> = {}
  private LogService: any

  constructor(hooks: UploadHooks = {}, LogService: any) {
    this.Hooks = { ...hooks }
    this.LogService = LogService
  }

  /**
   * 注册钩子函数
   * @param name 钩子名称
   * @param handler 钩子处理函数
   */
  registerHook<K extends keyof UploadHooks>(name: K, handler: UploadHooks[K]) {
    if (handler) {
      this.Hooks[name] = handler
    }
  }
  /**
   * 执行钩子函数
   * @param name 钩子名称
   * @param args 传递给钩子的参数
   * @returns 是否允许继续执行下一步
   */
  async executeHook<K extends keyof UploadHooks>(
    name: K,
    ...args: Parameters<NonNullable<UploadHooks[K]>>
  ): Promise<boolean> {
    const hook = this.Hooks[name]
    if (!hook) {
      // 如果没有注册钩子，默认允许继续
      return true
    }

    try {
      // 上传分片钩子处理(同步)
      if (name === 'onUploadChunkByRequest') {
        hook(...args)
        return true
      }

      // 记录日志
      this.updateLog(name, ...args)

      // 执行钩子，支持同步和异步
      const result = await hook(...args)
      // 严格检查返回值，只有明确返回true才允许继续
      return result
    } catch (error) {
      console.error(`Hook ${String(name)} execution failed:`, error)
      // 钩子执行出错时，阻止继续执行
      return false
    }
  }
  // this.LogService.addLog(`并发队列：所有分片上传完成，开始合并`, 'info')

  /* 更新日志信息 */
  updateLog(name: string, data?: any) {
    switch (name) {
      
      // 文件选择
      case 'onFileSelected':
        this.LogService.addLog(`文件服务：已添加${data.fileLength}个文件`, 'info')
        break
      // 文件分片
      case 'onFileChunking':
        this.LogService.addLog(`分片服务：${data.fileName}，分片 ${data.chunkList.length} 个`, 'info')
        break
      // 文件哈希计算
      case 'onFileHashed':
        const msg = `🗃️文件：${data.fileName} ，大小：${data.fileSize}，分片共计${data.chunkCount}个，计算文件和分片哈希总耗时：${data.duration}秒`
        const log = `${data.fileName} ，hash总耗时：${data.duration}秒`
         console.log(msg)
        this.LogService.addLog(`Hash服务：${log}`, 'info')
        break
      // 文件添加到上传队列
      case 'onFileAdded':
        this.LogService.addLog(`队列服务：已添加 ${data.taskCount} 个任务`, 'info')
        break
      // 文件分片上传成功
      case 'onChunkUploaded':
        this.LogService.addLog(`队列服务：已完成 ${data.uploadedChunkCount} 个任务`, 'info')
        break

      // 合并分片结束
      case 'onChunkMergeEnd':
        this.LogService.addLog(`并发队列：${data.fileName} 分片合并完成 `, 'info')
        break
      // 所有文件上传完成
      case 'onAllComplete':
        this.LogService.addLog(`并发队列：所有文件上传完成`, 'success')
        break
        
      default:
        break
    }
  }
}

export default LifeCycle
